// 给你一个整数数组 nums ，请你找出一个具有最大和的连续子数组（子数组最少包含一个元素），返回其最大和。

// 子数组
// 是数组中的一个连续部分。

var maxSubArray = function (nums) {
    // 法一：动态规划
    if (nums.every(item => item < 0)) {
        // 特殊情况全是负数
        return Math.max(...nums)
    }
    let max = nums[0];
    let curSum = 0;
    nums.forEach((item) => {
        // 判断之前的累加是否是对后一项有利的，有利则加上，否则直接设为0，重新开始计算当前索引往后的最大值
        curSum += item
        if (curSum < 0) curSum = 0;
        max = max > curSum ? max : curSum
    })
    return max;


    // let pre = 0, maxAns = nums[0];
    // nums.forEach((x) => {
    //     pre = Math.max(pre + x, x);
    //     maxAns = Math.max(maxAns, pre);
    // });
    // return maxAns;
};